<div class="offset1">
    <?php
    // permite al usuario seleccionar los AuthItems que conforman a ROLE o TASK
    // las OPERATIONS no tienen childs.
    //
	// argumentos recibidos:
    //
	// $model: instancia de CAuthItem
    //
	Yii::app()->clientScript->registerCoreScript('jquery');
    $rbac = Yii::app()->user->rbac;
    $roles = $rbac->getRoles();
    $tareas = $rbac->getTasks();
    $operaciones = $rbac->getOperations();
    // items asignados a la instancia de CAuthItem seleccionado ($model)
    $childrens = $rbac->getItemChildren($model->name);

    // ROLES
    $treeDataRoles = array();
    // TASKS
    $treeDataMenu = array();
    $treeDataError = array();
    $treeDataRegular = array();
    // OPERATIONS
    $treeDataOps = array();

    // titulos
    echo "<legend>" . ucfirst($model->name) . " (" .
    CrugeTranslator::t($rbac->getAuthItemTypeName($model->type)) . ")</legend>";
    echo "<h3 class='hint'>" . $model->description . "</h3>";
    echo "<p>" . ucfirst(CrugeTranslator::t(
                    "haga click en un item para activarlo o desactivarlo")) . "</p>";

    $iconPin = Yii::app()->user->ui->getResource('pin.png');
    $imgPin = "<img class='pin-on' src='{$iconPin}' title='"
            . CrugeTranslator::t("Click para asignar/desasignar el item") . "'>";

    //  LISTA DE ROLES 
    //		si hay roles definidos y la vista no es para un TASK.
    //
	if ((count($roles) > 0) && ($model->type != CAuthItem::TYPE_TASK)) {

        foreach ($roles as $item) {
            $asignado = isset($childrens[$item->name]) ? 'checked' : '';
            $loop = $rbac->detectLoop($model->name, $item->name) ? "loop" : "";
            $treeDataRoles[] = array(
                'id' => $item->name,
                'text' => "<span class='{$asignado} {$loop}'>" . $item->name
                . "</span>" . $imgPin,
                'htmlOptions' => array('class' => 'authitem',
                    'alt' => $item->name),
            );
        }
    }

    // LISTA DE TAREAS - organizadas segun el uso de sintaxis en descripcion
    //	(leer acerca de la sintaxis en la clase CrugeAuthManager)
    if (count($tareas) > 0) {
        $taskinfo = $rbac->explodeTaskArray($tareas);

        // despliega las tareas que son MENU y SUBMENU pero usando
        // un TreeView
        //
		if (count($taskinfo['topmenu']) > 0) {
            foreach ($taskinfo['topmenu'] as $topTask) {
                $text = $rbac->getTaskText($topTask);
                $hasChildren = false;
                $children = array();
                if (isset($taskinfo['childmenu'][$topTask->name]))
                    foreach ($taskinfo['childmenu'][$topTask->name] as $child) {
                        $asignado = isset($childrens[$child->name]) ?
                                'checked' : '';
                        $loop = $rbac->detectLoop($model->name, $child->name) ?
                                "loop" : "";
                        $hasChildren = true;
                        $children[] = array(
                            'id' => $child->name,
                            'text' => "<span class='itemchildtext authitemsub {
							$asignado} {$loop}'>"
                            . $rbac->getTaskText($child) . "</span>" . $imgPin,
                            'htmlOptions' => array('class' => 'authitemchild'
                                , 'alt' => $child->name
                                , 'title' => $child->name),
                        );
                    }
                $asignado = isset($childrens[$topTask->name]) ? 'checked' : '';
                $loop = $rbac->detectLoop($model->name, $topTask->name) ?
                        "loop" : "";
                $treeDataMenu[] = array(
                    'id' => $topTask->name,
                    'text' => "<span class='itemtext authitemtop {$asignado} {
						$loop}'>" . $text
                    . "</span>" . $imgPin,
                    'expanded' => false,
                    'hasChildren' => $hasChildren,
                    'children' => $children,
                    'htmlOptions' => array('class' => 'authitem',
                        'alt' => $topTask->name, 'title' => $topTask->name),
                );
            }
        }

        // Muestra las tareas que fueron consideradas menues pero sus
        // nodos padre no existen. (tienen su sintaxis de descripcion errada).
        if (count($taskinfo['orphan']) > 0)
            foreach ($taskinfo['orphan'] as $orpTask) {
                $asignado = isset($childrens[$orpTask->name]) ? 'checked' : '';
                $loop = $rbac->detectLoop($model->name, $orpTask->name) ?
                        "loop" : "";
                $treeDataError[] = array(
                    'id' => $orpTask->name,
                    'text' => "<span class='{$asignado} {$loop}'>" .
                    $rbac->getTaskText($orpTask) . "</span>" . $imgPin,
                    'expanded' => false,
                    'hasChildren' => false,
                    'htmlOptions' => array('class' => 'authitem'
                        , 'alt' => $orpTask->name),
                );
            }

        // Muestra las tareas regulares, aquellas no marcadas con sintaxis.
        // en otras palabras las tareas comunes y silvestres!
        if (count($taskinfo['regular']) > 0)
            foreach ($taskinfo['regular'] as $task) {
                $asignado = isset($childrens[$task->name]) ? 'checked' : '';
                $loop = $rbac->detectLoop($model->name, $task->name) ?
                        "loop" : "";
                $treeDataRegular[] = array(
                    'id' => $task->name,
                    'text' => "<span class='{$asignado} {$loop}'>" .
                    $task->name . "</span>" . $imgPin,
                    'expanded' => false,
                    'hasChildren' => false,
                    'htmlOptions' => array('class' => 'authitem',
                        'alt' => $task->name),
                );
            }
    }

    // LISTA DE OPERACIONES	- organizadas con un filtro
    //
	if (count($operaciones) > 0) {

        // arma una lista de categorias en conjunto con el dato 'filter'
        // usado para agrupar las operaciones con el metodo:
        //	$rbac->getOperationsFiltered(...)
        //
		$listacatg = array();
        $listacatg['1'] = CrugeTranslator::t('Módulos');
//		$listacatg['3'] = CrugeTranslator::t('Controllers');
//		foreach($rbac->enumControllers() as $controllerName)
//			$listacatg[$controllerName] = $controllerName;
        $listacatg['2'] = CrugeTranslator::t('Usuarios');

        // cada categoria es un sub nodo del arbol CTreeView::operations
        //
		foreach ($listacatg as $catg_filter => $catg_name) {
            $childs = array();
            foreach ($rbac->getOperationsFiltered($catg_filter, $operaciones)
            as $item) {
                // por cada operacion filtrada por $filter la agrega

                $asignado = isset($childrens[$item->name]) ? 'checked' : '';
                $loop = $rbac->detectLoop($model->name, $item->name) ?
                        "loop" : "";

                $childs[] = array(
                    'id' => $item->name,
                    'text' => "<span class='{$asignado} {$loop}'>" .
                    $item->name . "</span>" . $imgPin,
                    'htmlOptions' => array('class' => 'authitem',
                        'alt' => $item->name),
                );
            }

            $treeDataOps[] = array(
                'text' => $catg_name,
                'hasChildren' => (count($childs) > 0) ? true : false,
                'expanded' => false,
                'children' => $childs,
            );
        }
    }

    // por razones de generar orden, no le da al usuario la posibilidad
    // de que a una tarea tipo subitem la componga de otros subitems
    // si se va a generar un enredo (para el).
    //
	if ($model->type == CAuthItem::TYPE_ROLE) {
        $arrayTareas = array(
            array(
                'text' => "<b>" . CrugeTranslator::t(
                        "Tareas Regulares") . "</b>",
                'expanded' => true,
                'hasChildren' => (count($treeDataRegular) > 0) ? true : false,
                'children' => $treeDataRegular,
            ),
            array(
                'text' => "<b>" . CrugeTranslator::t(
                        "Tareas de tipo Menu") . "</b>",
                'expanded' => true,
                'hasChildren' => (count($treeDataMenu) > 0) ? true : false,
                'children' => $treeDataMenu,
            ),
            array(
                'text' => "<b>" . CrugeTranslator::t(
                        "Tareas Huerfanas") . "</b>",
                'expanded' => true,
                'hasChildren' => (count($treeDataError) > 0) ? true : false,
                'children' => $treeDataError,
            ),
        );
    } else {
        $arrayTareas = array(
            array(
                'text' => "<b>" . CrugeTranslator::t(
                        "Tareas Regulares") . "</b>",
                'expanded' => true,
                'hasChildren' => (count($treeDataRegular) > 0) ? true : false,
                'children' => $treeDataRegular,
            ),
            array(
                'text' => "<b>" . CrugeTranslator::t(
                        "Tareas Huerfanas") . "</b>",
                'expanded' => true,
                'hasChildren' => (count($treeDataError) > 0) ? true : false,
                'children' => $treeDataError,
            ),
        );
    }

    $this->widget('CTreeView', array(
        'id' => 'auth-item-tree',
        'persist' => 'cookie',
        'data' =>
        array(
            // ROLES  TREENODE
            array(
                'text' => "<b>" . CrugeTranslator::t("Roles") . "</b>",
                'expanded' => true,
                'children' => $treeDataRoles,
            ), //end roles treenode
            // TAREAS TREENODE
            array(
                'text' => "<b>" . CrugeTranslator::t("Tareas") . "</b>",
                'expanded' => true,
                'children' => $arrayTareas,
            ), //end tareas treenode
            // OPERATIONS  TREENODE
            array(
                'text' => "<b>" . CrugeTranslator::t(
                        "Operaciones Organizadas por Tipo") . "</b>",
                'expanded' => true,
                'children' => $treeDataOps,
            ), //end operations treenode
        )
    ));
    ?>
</div>
<script>
    $('img.pin-on').each(function() {
        var img = $(this);
        img.css("cursor", "pointer");
        img.click(function() {

            // el atributo alt del LI tiene el nombre del item que representa.
            var _li = $(this).parent();
            var thisItemName = _li.attr('alt');
            var span = _li.find('span');

            //var istop = span.hasClass("authitemtop");
            //var issub = span.hasClass("authitemsub");
            //var tiponodo = 0;
            //if(istop==false && issub==false) tiponodo='normal'; // rol, tarea
            //if(istop==true && issub==true) tiponodo='top'; // es un topmenu
            //if(istop==false && issub==true) tiponodo='sub'; // es un submenu

            // el nuevo valor segun el valor checked actual
            var setFlag = span.hasClass('checked') ? false : true;

            //alert("tiponodo="+tiponodo+" newFlag="+setFlag+", span="
            //	+span.html());
            //return;

            var action = '<?php echo Yii::app()->user->ui->getRbacAjaxSetChildItemUrl() ?>';
            var jsondata = "{ \"parent\": \"<?php echo $model->name; ?>\" , \"child\": "
                    + "\"" + thisItemName + "\" , \"setflag\": " + setFlag + " }";
            var loadingUrl = '<?php echo Yii::app()->user->ui->getResource('loading.gif'); ?>';
            var loader = _li.find('span.loader');

            loader.html("<img src='" + loadingUrl + "'>");
            $('#_errorResult').html("");
            jQuery.ajax({
                url: action,
                type: 'post',
                async: true,
                // contentType: "application/json",
                cached: false,
                data: jsondata,
                success: function(data, textStatus, jqXHR) {
                    loader.html("");
                    // si se pudo realizar la accion, aqui data trae un objeto 
                    // json con la data del item
                    if (data.result == true) {
                        span.addClass("checked");
                    } else {
                        span.removeClass("checked");
                    }
                },
                error: function(jqXHR, textStatus, errorThrown) {
                    //$('#_errorResult').html("Ocurrio un error:<hr>"
                    //+jqXHR.responseText);
                    $('#_errorResult').html("<p class='auth-item-error-msg'>"
                            + "no se pudo agregar<br/>" + jqXHR.responseText + "</p>");
                    $('#_errorResult').show("slow");
                    setTimeout(function() {
                        $('#_errorResult').hide("slow");
                        $('#_errorResult').html("");
                    }, 3000);
                    loader.html("");
                },
            });
        });
    });


</script>

<div id='_errorResult'></div>
<div id='_log'></div>

